<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Class Article
 * 文章管理控制器
 * @author wuliang
 */
class Article extends MY_Controller {

    public function __construct() {
        parent::__construct();
        // 加载模型
        $this->load->model('Article_model', 'art');
    }

    /**
     * 查看文章视图
     */
    public function index () {
        // 载入分页类
        $this->load->helper('page');
        // 分页配置项
        $perPage = 2;
        // 创建分页
        $data['link'] = pageCreate('admin/article/index',$this->art->count(),$perPage);

        $offset = $this->uri->segment(4);    // 偏移量，uri中代表页数的分段
        $this->db->limit($perPage, $offset);
        $data['art'] = $this->art->getAll(); // 读取文章列表

        $this->load->view('admin/article.php',$data);
    }

    /**
     * 添加文章表单视图
     * @param string $error null 显示的错误信息
     */
    public function addArticle ($error = null) {
        // 加载表单辅助函数
        $this->load->helper('form');
        // 加载栏目操作模型
        $this->load->model('Category_model','cate');
        // 读取所有栏目
        $data['cate'] = $this->cate->getAll();
        $data['error'] = $error;

        $this->load->view('admin/addArticle.php',$data);
    }

    /**
     * 添加文章表单处理
     * 缩略图的上传和剪裁
     */
    public function runAddArticle () {
        // 加载表单验证类
        $this->load->library('form_validation');
        // 执行验证
        $status = $this->form_validation->run('article');

        if ($status) { // 表单验证通过
            // 先处理图片上传，获取图片上传信息
            $info = $this->upload('thumb',true);
            // 如果$data不是数组类型，则说明出现了错误，在添加文章视图显示错误信息
            if ( ! is_array($info)) {
                $this->addArticle($info);
            } else {    // 上传成功，将文章信息写入数据库
                // 组织数据
                $data = array(
                    'title' => $this->input->post('title'),
                    'type'  => $this->input->post('type'),
                    'cid'   => $this->input->post('cid'),
                    'thumb' => 'upload/'.$info['file_name'],
                    'info'  => $this->input->post('info'),
                    'author'=> $this->session->userdata('username'),
                    'time'  => time(),
                    'content' => htmlspecialchars($this->input->post('content'))
                );

                // 执行插入操作
                if ($this->art->add($data)) success('admin/article/index','添加成功');
                else error('添加文章失败');
            }
        } else {  // 表单验证没有通过
            // 重新显示添加文章视图
            $this->addArticle();
        }
    }

    /**
     * 编辑文章表单视图
     * @param $aid
     * @param null $error
     */
    public function editArticle ($aid, $error = null) {
        // 加载表单辅助函数
        $this->load->helper('form');
        // 加载栏目操作模型
        $this->load->model('Category_model','cate');
        // 读取所有栏目
        $data['cate'] = $this->cate->getAll();
        $data['error'] = $error;
        // 读取编辑文章信息
        $data['article'] = $this->art->getOne($aid);

        $this->load->view('admin/editArticle.php',$data);
    }

    /**
     * 编辑文章表单处理
     */
    public function runEditArticle () {
        // 加载表单验证类
        $this->load->library('form_validation');
        // 执行验证
        $status = $this->form_validation->run('article');
        $aid = $this->input->post('aid');

        if ( ! $status) {  // 验证未通过
            $this->editArticle($aid);
        } else {  // 验证通过
            // 组织文章信息数据
            $data = array(
                'title' => $this->input->post('title'),
                'type'  => $this->input->post('type'),
                'cid'   => $this->input->post('cid'),
                'info'  => $this->input->post('info'),
                'author'=> $this->session->userdata('username'),
                'time'  => time(),
                'content' => htmlspecialchars($this->input->post('content'))
            );
            // 如果有重新上传图片，重新处理上传的图片
            if ($_FILES['thumb']) {
                $info = $this->upload('thumb', TRUE);
                if ( ! is_array($info)) { // 在图片处理过程中，出现错误
                    $this->editArticle($aid,$info);
                } else {
                    // 载入文件辅助函数
                    $this->load->helper('file');
                    // 删除服务器图片文件夹下，原来的图片，避免垃圾文件占用内存
                    $img_to_delete = base_url() .$this->input->post('orig');
                    delete_files($img_to_delete);
                    $data['thumb'] = 'upload/'.$info['file_name'];
                }
            }

            // 将更新数据写入数据库
            if ($this->art->update($aid, $data)) {
                success('admin/article/index', '更新文章成功');
            } else {
                error('更新文章失败');
            }
        }
    }

    /**
     * 删除文章视图
     */
    public function delArticle () {
        // 载入分页类
        $this->load->library('pagination');
        // 配置分页配置项
        $perPage = 10;
        $config = array(
            'base_url' => site_url('admin/article/delArticle'),
            'total_rows' => $this->art->count(1),
            'per_page' => $perPage,
            'uri_segment' => 4,
            'first_link' => '第一页',
            'next_link' => '下一页',
            'prev_link' => '上一页',
            'last_link' => '最后一页'
        );

        // 初始化分页类配置项
        $this->pagination->initialize($config);
        // 创建分页
        $data['link'] = $this->pagination->create_links();

        $offset = $this->uri->segment(4);
        $this->db->limit($perPage, $offset);
        $data['art'] = $this->art->getAll(1);

        $this->load->view('admin/delArticle',$data);
    }

    /**
     * 后台文章操作
     * recommend : 站长推荐  unRecommend : 取消推荐
     * editArticle : 编辑  invalidArticle : 删除
     * recoverArticle : 恢复  deleteArticle : 彻底删除
     */
    public function operation () {
        $aid = $this->uri->segment(5);
        $operation = $this->uri->segment(4);
        switch ($operation) {
            case 'recommend' :  // 站长推荐
                if ($this->art->recommend($aid)) success('admin/article/index','推荐成功');
                else error('推荐失败');
            break;
            case 'unRecommend' : // 取消推荐
                if ($this->art->recommend($aid,TRUE)) success('admin/article/index','取消推荐成功');
                else error('取消推荐失败');
            break;
            case 'editArticle' : // 编辑文章
                $this->editArticle($aid);
            break;
            case 'invalidArticle' : // 删除文章
                if ($this->art->deleteOrRecoverOne($aid, 1))  success('admin/article/index', '文章删除成功');
                else error('文章删除失败');
            break;
            case 'recoverArticle' : // 恢复删除文章
                if ($this->art->deleteOrRecoverOne($aid, 0)) success('admin/article/delArticle', '恢复删除文章成功');
                else error('恢复删除文章失败');
            break;
            case 'deleteArticle' : // 彻底删除文章
                if ($this->art->deleteOne($aid)) success('admin/article/delArticle', '彻底删除文章成功');
                else ( '彻底删除文章失败');
            break;
        }
    }

    /**
     * 后台文章管理，批量操作
     */
    public function multiple () {
        // 进行批量操作时选中的文章id
        $aid = rtrim($_REQUEST['aid'],',');
        // 批量操作的类型
        $operation = $this->uri->segment(4);
        if ($this->art->multiple($aid,$operation)){
            echo 'success';
        } else {
            echo 'fail';
        }
    }

    /**
     * 文件上传
     * @param string $file  上传文件的表单域名
     * @param bool $thumb 是否进行缩略
     * @return mixed
     */
    public function upload ($file, $thumb = false) {
        // 载入文件上传类，相关配置以配置文件的形式存在
        $this->load->library('upload');
        // 执行上传操作
        if ( ! $this->upload->do_upload($file)) {  // 上传失败
            // 获取上传失败信息
            $error = $this->upload->display_errors('<span>','</span>');
            // 返回错误信息
            return $error;
        } else {                                   // 上传成功
            // 获取上传成功后上传文件的信息
            $data = $this->upload->data();

            // 判断是否需要对图片执行剪裁操作
            if ($thumb) {
                $info = $this->thumb($data['full_path']);
                // 如果 $info 不为空，说明在缩略处理时有错误
                if ($info) return $info;
            }
        }

        return $data;
    }

    /**
     * 图片缩略
     * @param $sourceImg  进行缩略处理的原图片
     * @param bool $createThumb 是否生成缩略图
     */
    public function thumb ($sourceImg, $createThumb = FALSE) {
        // 缩略图配置
        $config = array(
            'source_image' => $sourceImg,
            'create_thumb' => $createThumb,
            'maintain_ration' => TRUE,
            'width'        => 200,
            'height'       => 200
        );

        // 加载图片处理类
        $this->load->library('image_lib',$config);

        // 执行图片的缩略处理
        if ( ! $this->image_lib->resize()) {
            // 缩略失败，获取失败信息
            $error = $this->image_lib->display_errors('<span>','</span>');
            // 返回错误信息
            return $error;
        }
    }
}